home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 4
/
FM Towns Free Software Collection 4 - Disc 1.iso
/
pao
/
towns
/
cdplay
/
src
/
cdtime.c
< prev
next >
Wrap
Text File
|
1991-10-18
|
29KB
|
1,007 lines
/* << High C V1.4 >> **********************************************************
**
** CD演奏ライブラリ用 CD-ROM時間計算プログラム
**
** 1991.02.09 : CREATE
** 1991.02.09 : FINISH
**
** < HISTORY >
** 1991.02.09 : CREATE
** 1991.02.27 : 全面改訂開始....
** 1991.03.23 : 全面改訂終了(新ライブラリ誕生)
** 1991.03.28 : programデータ追加時のディスク内経過/ディスク内残り時間のバグ修正.
** 1991.03.30 : CDDA_next_music() にて最後の曲の時の処理で、プログラムモード用
** 残り曲数の設定に誤りがあったのを修正.
** 1991.06.07 : 清書
**
** < note > : TABS = 4
**
** All Rights Reserved, Copyright (C) Y.Hirata 1991.
**
** Programmed by Y.Hirata ( Nifty ID : NAB03321 )
**
******************************************************************************/
#undef _CDDA_LIB
#include <string.h>
#include <stdlib.h>
#include "cdda.h"
extern char CDDA_FLG_pauseplay ; /* 演奏開始指定時間にPAUSE解除するか? */
extern int CDDA_PLAY_no[CDDA_MAX_TRACK] ; /* 演奏用曲番号格納 */
extern int CDDA_nplay ; /* 次は↑の内何番目か? */
extern int CDDA_prgptr ; /* プログラム用ポインタ */
extern int CDDA_PLAY_mode ; /* 現在の演奏モード */
/************************** 時間の大小を求める *****************************/
int CDDA_cmptime(
signed char min1,signed char sec1,signed char frame1,
signed char min2,signed char sec2,signed char frame2 )
/*=============================================================================
** 2つのCD用時間を比較する.
**
** < INPUT > : 比較する2つの時間(分・秒・フレーム)
** < OUTPUT > : なし
** < RETURN > : 大小関係( T1 < T2 は -1 , T1 = T2 は 0 , T1 > T2 は +1 )
**
** 時間の正当性チェックはしていないので、不当データを使用しないようにして下さい.
=============================================================================*/
{
if ( min1 > min2 ) {
return( 1 ) ; /* TIME1 > TIME2 */
} else if ( min1 == min2 ) {
if ( sec1 > sec2 ) {
return( 1 ) ; /* TIME1 > TIME2 */
} else if ( sec1 == sec2 ) {
if ( frame1 > frame2 ) {
return( 1 ) ; /* TIME1 > TIME2 */
} else if ( frame1 == frame2 ) {
return( 0 ) ; /* TIME1 = TIME2 */
} else {
return( -1 ) ; /* TIME1 < TIME2 */
}
} else {
return( -1 ) ; /* TIME1 < TIME2 */
}
} else {
return( -1 ) ; /* TIME1 < TIME2 */
}
}
/**************************** 時間差を求める *******************************/
void CDDA_subtime(
char min1,char sec1,char frame1,
char min2,char sec2,char frame2,
char *min,char *sec,char *frame )
/*=============================================================================
** 2つのCD用時間の差を求める.
**
** < INPUT > : 時間1, 時間2 (分・秒・フレーム)
** < OUTPUT > : 時間3 = 時間1 - 時間2 (分・秒・フレーム)
** < RETURN > : なし
**
** 必ず 時間1 >= 時間2 として下さい.
** 時間の正当性チェックはしていないので、不当データを使用しないようにして下さい.
=============================================================================*/
{
*min = 0 ; *sec = 0 ; *frame = 0 ;
if ( frame1 >= frame2 ) {
*frame = frame1 - frame2 ;
} else {
frame1 += 75 ;
if ( sec1 == 0 ) {
sec1 += 60 ;
min1 -- ;
}
sec1 -- ;
*frame = frame1 - frame2 ;
}
if ( sec1 >= sec2 ) {
*sec = sec1 - sec2 ;
} else {
sec1 += 60 ;
min1 -- ;
*sec = sec1 - sec2 ;
}
*min = min1 - min2 ;
}
/**************************** 時間和を求める *******************************/
void CDDA_addtime(
char min1,char sec1,char frame1,
char min2,char sec2,char frame2,
char *min,char *sec,char *frame )
/*=============================================================================
** 2つのCD用時間の和を求める.
**
** < INPUT > : 時間1, 時間2 (分・秒・フレーム)
** < OUTPUT > : 時間3 = 時間1 + 時間2 (分・秒・フレーム)
** < RETURN > : なし
**
** 時間の正当性チェックはしていないので、不当データを使用しないようにして下さい.
=============================================================================*/
{
min1 += min2 ;
sec1 += sec2 ;
frame1 += frame2 ;
if ( sec1 >= 60 ) {
sec1 -= 60 ;
min1 ++ ;
}
if ( frame1 >= 75 ) {
frame1 -= 75 ;
sec1 ++ ;
if ( sec1 >= 60 ) {
sec1 -= 60 ;
min1 ++ ;
}
}
*min = min1 ;
*sec = sec1 ;
*frame = frame1 ;
}
/*************************** 演奏開始時間の設定 ****************************/
void CDDA_set_time_start( int trackno )
/*=============================================================================
** 演奏用の開始時間を設定する.
**
** < INPUT > : 演奏開始トラック(曲番号:1~99)
** < OUTPUT > : なし
** < RETURN > : なし
**
** 不当な曲番号が指定された場合には、強制的に曲番号を変更します.
=============================================================================*/
{
int c ;
if ( trackno < CDDA_INFO_buf.start ) trackno = CDDA_INFO_buf.start ;
if ( trackno > CDDA_INFO_buf.end ) trackno = CDDA_INFO_buf.end ;
if ( CDDA_data_check( trackno ) ) { /* データ */
for ( c=trackno+1; c<CDDA_INFO_buf.end; c++ ) {
trackno ++ ;
if ( !CDDA_data_check( trackno ) ) { /* 曲 */
break ;
}
}
if ( c == CDDA_INFO_buf.end ) trackno = CDDA_INFO_buf.end ;
}
CDDA_NOW_start = trackno ;
CDDA_CLOCK_start.sec = CDDA_INFO_buf.track[trackno-1].sec ;
CDDA_CLOCK_start.min = CDDA_INFO_buf.track[trackno-1].min ;
CDDA_CLOCK_start.frame = CDDA_INFO_buf.track[trackno-1].frame ;
}
/************************* 演奏終了時間の設定 ******************************/
void CDDA_set_time_end( int trackno )
/*=============================================================================
** 演奏用の終了時間を設定する.
**
** < INPUT > : 演奏終了トラック(曲番号)
** < OUTPUT > : なし
** < RETURN > : なし
**
** 不当な曲番号が指定された場合には、強制的に曲番号を変更します.
=============================================================================*/
{
char minw, secw, framew ;
int c ;
/* frame : 0 - 74 : 75frame=1sec */
if ( trackno < CDDA_INFO_buf.start ) trackno = CDDA_INFO_buf.start ;
if ( trackno < CDDA_INFO_buf.end ) {
if ( CDDA_data_check( trackno+1 ) ) { /* データ */
trackno ++ ;
for ( c=trackno+1; c<CDDA_INFO_buf.end; c++ ) {
trackno ++ ;
if ( !CDDA_data_check( trackno ) ) { /* 曲 */
break ;
}
}
if ( c >= CDDA_INFO_buf.end ) trackno = CDDA_INFO_buf.end ;
}
} else {
trackno = CDDA_INFO_buf.end ;
}
/*
** 最後の曲まで(または最後の曲だけを)演奏した~い時には、
** 演奏終了時間の指定に注意しましょう!
**
** ※ 演奏終了時間は、ディスク内演奏終了時間から 1 フレーム引いた値を指定
** しないとだめだよ!
*/
if ( trackno >= CDDA_INFO_buf.end ) { /* 最終曲が指定された時 */
trackno = CDDA_INFO_buf.end ;
framew = CDDA_INFO_buf.discend.frame ;
secw = CDDA_INFO_buf.discend.sec ;
minw = CDDA_INFO_buf.discend.min ;
} else { /* 最終曲じゃない時 */
framew = CDDA_INFO_buf.track[trackno].frame ;
secw = CDDA_INFO_buf.track[trackno].sec ;
minw = CDDA_INFO_buf.track[trackno].min ;
}
/* 1フレーム引く */
CDDA_subtime( minw,secw,framew,0,0,1,&minw,&secw,&framew ) ;
CDDA_NOW_end = trackno ;
CDDA_CLOCK_end.frame = framew ;
CDDA_CLOCK_end.sec = secw ;
CDDA_CLOCK_end.min = minw ;
}
/**************************** 各曲の時間を求める ***************************/
void CDDA_timecalc( void )
/*=============================================================================
** 各曲の演奏時間, 音楽部分の合計時間, データ部分の合計時間を求める.
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : なし
**
** 必ず TOC情報取得後にこの関数をCALLして下さい.
=============================================================================*/
{
int c ;
char minw, min2, sec2, frame2 ;
/* 一番上のビットがONの場合には、曲ではなくデータである。 */
CDDA_TIME_music.min = CDDA_TIME_music.sec = CDDA_TIME_music.frame = 0 ;
CDDA_TIME_data.min = CDDA_TIME_data.sec = CDDA_TIME_data.frame = 0 ;
for ( c=0; c<CDDA_INFO_buf.end; c++ ) {
minw = CDDA_INFO_buf.track[c].min ;
if ( ( minw & 0x80 ) == 0x80 ) minw &= 0x7f ;
if ( c+1 < CDDA_INFO_buf.end ) { /* 次の曲が最終曲ヨリ前 */
frame2 = CDDA_INFO_buf.track[c+1].frame ;
sec2 = CDDA_INFO_buf.track[c+1].sec ;
min2 = CDDA_INFO_buf.track[c+1].min ;
if ( ( min2 & 0x80 ) == 0x80 ) min2 &= 0x7f ;
} else { /* 次の曲が最終曲 */
frame2 = CDDA_INFO_buf.discend.frame ;
sec2 = CDDA_INFO_buf.discend.sec ;
min2 = CDDA_INFO_buf.discend.min ;
if ( ( min2 & 0x80 ) == 0x80 ) min2 &= 0x7f ;
CDDA_subtime( min2,sec2,frame2,0,0,1,&min2,&sec2,&frame2 ) ;
/* 1フレーム引く */
}
CDDA_subtime( min2,sec2,frame2,minw,
CDDA_INFO_buf.track[c].sec,CDDA_INFO_buf.track[c].frame,
&CDDA_TIME_track[c].min,&CDDA_TIME_track[c].sec,
&CDDA_TIME_track[c].frame ) ;
/* 曲時間取得 */
minw = CDDA_INFO_buf.track[c].min ;
if ( ( minw & 0x80 ) != 0x80 ) { /* CD-DA だけ加算 */
CDDA_addtime( CDDA_TIME_music.min,CDDA_TIME_music.sec,
CDDA_TIME_music.frame,
CDDA_TIME_track[c].min,CDDA_TIME_track[c].sec,
CDDA_TIME_track[c].frame,
&CDDA_TIME_music.min,&CDDA_TIME_music.sec,
&CDDA_TIME_music.frame ) ;
/* 合計時間取得 */
} else { /* データ部分の合計 */
CDDA_addtime( CDDA_TIME_data.min,CDDA_TIME_data.sec,
CDDA_TIME_data.frame,
CDDA_TIME_track[c].min,CDDA_TIME_track[c].sec,
CDDA_TIME_track[c].frame,
&CDDA_TIME_data.min,&CDDA_TIME_data.sec,
&CDDA_TIME_data.frame ) ;
/* 合計時間取得 */
}
}
/*
** プログラム時間クリア
*/
CDDA_TIME_program.min = CDDA_ZERO ;
CDDA_TIME_program.sec = CDDA_ZERO ;
CDDA_TIME_program.frame = CDDA_ZERO ;
}
/************************** 現在の残り時間を求める *************************/
void CDDA_remaintime( void )
/*=============================================================================
** 演奏時間(曲内時間,ディスク内時間)を求める.
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : なし
**
** 演奏状態取得後にこの関数をCALLして下さい.
** (CDDA_status()で、この関数はCALLされています)
=============================================================================*/
{
int c ;
/*
** 曲番号が不正な時(演奏可能曲でない時)
*/
if ( CDDA_INFO_buf.start > CDDA_NOW_musicno ||
CDDA_NOW_musicno > CDDA_INFO_buf.end ||
CDDA_data_check( CDDA_NOW_musicno ) ||
CDDA_NOW_musicno <= CDDA_ZERO ) {
CDDA_CLOCK_nowtrack.min = CDDA_ZERO ;
CDDA_CLOCK_nowtrack.sec = CDDA_ZERO ;
CDDA_CLOCK_nowtrack.frame = CDDA_ZERO ;
memcpy( (char *)&CDDA_TIME_nowtrack,(char *)&CDDA_CLOCK_nowtrack,
sizeof( CDDA_TRACK ) ) ;
memcpy( (char *)&CDDA_CLOCK_nowdisc,(char *)&CDDA_CLOCK_nowtrack,
sizeof( CDDA_TRACK ) ) ;
memcpy( (char *)&CDDA_TIME_nowdisc,(char *)&CDDA_CLOCK_nowtrack,
sizeof( CDDA_TRACK ) ) ;
return ;
}
/*
** 現在の曲の残り時間
*/
CDDA_subtime( CDDA_TIME_track[CDDA_NOW_musicno-1].min,
CDDA_TIME_track[CDDA_NOW_musicno-1].sec,
CDDA_TIME_track[CDDA_NOW_musicno-1].frame,
CDDA_CLOCK_nowtrack.min,
CDDA_CLOCK_nowtrack.sec,
CDDA_CLOCK_nowtrack.frame,
&CDDA_TIME_nowtrack.min,
&CDDA_TIME_nowtrack.sec,
&CDDA_TIME_nowtrack.frame ) ;
memcpy( (char *)&CDDA_TIME_nowdisc,(char *)&CDDA_TIME_nowtrack,
sizeof( CDDA_TRACK ) ) ;
/*
** トータルの残り時間
*/
switch ( CDDA_PLAY_mode ) {
case CDDA_SW_SHUFFLE :
case CDDA_SW_PROGRAM :
case CDDA_SW_CONTINUE :
for ( c=0; c<CDDA_MAX_TRACK; c++ ) {
if ( CDDA_nplay+c >= CDDA_MAX_TRACK ) break ;
if ( CDDA_PLAY_no[CDDA_nplay+c] <= CDDA_ZERO ) break ;
if ( !CDDA_data_check(CDDA_PLAY_no[CDDA_nplay+c]) ) {
/* 音楽ならば... */
CDDA_addtime( CDDA_TIME_nowdisc.min,
CDDA_TIME_nowdisc.sec,
CDDA_TIME_nowdisc.frame,
CDDA_TIME_track[CDDA_PLAY_no[CDDA_nplay+c]-1].min,
CDDA_TIME_track[CDDA_PLAY_no[CDDA_nplay+c]-1].sec,
CDDA_TIME_track[CDDA_PLAY_no[CDDA_nplay+c]-1].frame,
&CDDA_TIME_nowdisc.min,
&CDDA_TIME_nowdisc.sec,
&CDDA_TIME_nowdisc.frame ) ;
}
}
break ;
case CDDA_SW_SINGLE :
break ;
}
/*
** トータルの経過時間
*/
switch ( CDDA_PLAY_mode ) {
case CDDA_SW_SHUFFLE :
case CDDA_SW_CONTINUE :
CDDA_subtime( CDDA_TIME_music.min,
CDDA_TIME_music.sec,
CDDA_TIME_music.frame,
CDDA_TIME_nowdisc.min,
CDDA_TIME_nowdisc.sec,
CDDA_TIME_nowdisc.frame,
&CDDA_CLOCK_nowdisc.min,
&CDDA_CLOCK_nowdisc.sec,
&CDDA_CLOCK_nowdisc.frame ) ;
break ;
case CDDA_SW_PROGRAM :
CDDA_subtime( CDDA_TIME_program.min,
CDDA_TIME_program.sec,
CDDA_TIME_program.frame,
CDDA_TIME_nowdisc.min,
CDDA_TIME_nowdisc.sec,
CDDA_TIME_nowdisc.frame,
&CDDA_CLOCK_nowdisc.min,
&CDDA_CLOCK_nowdisc.sec,
&CDDA_CLOCK_nowdisc.frame ) ;
break ;
case CDDA_SW_SINGLE :
memcpy( (char *)&CDDA_CLOCK_nowdisc,(char *)&CDDA_CLOCK_nowtrack,
sizeof( CDDA_TRACK ) ) ;
break ;
}
}
/********************* プログラム関係の現在の残り時間を求める *****************/
void CDDA_program_remaintime( void )
/*=============================================================================
** プログラム関係の演奏時間(曲内時間,ディスク内時間)を求める.
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : なし
**
** プログラムモードの時に曲番号の追加/確認用にこの関数を使用します.
** プログラム合計時間(CDDA_TIME_PROGRAM), 曲内経過時間(CDDA_CLOCK_nowtrack)は、
** 呼び出す前に設定しておいて下さい.
=============================================================================*/
{
int c, sp ;
if ( CDDA_PLAY_mode != CDDA_SW_PROGRAM ) return ;
/*
** 現在の曲内残り時間
*/
if ( CDDA_NOW_musicno > CDDA_ZERO ) {
CDDA_subtime( CDDA_TIME_track[CDDA_NOW_musicno-1].min,
CDDA_TIME_track[CDDA_NOW_musicno-1].sec,
CDDA_TIME_track[CDDA_NOW_musicno-1].frame,
CDDA_CLOCK_nowtrack.min,
CDDA_CLOCK_nowtrack.sec,
CDDA_CLOCK_nowtrack.frame,
&CDDA_TIME_nowtrack.min,
&CDDA_TIME_nowtrack.sec,
&CDDA_TIME_nowtrack.frame ) ;
} else {
CDDA_TIME_nowtrack.min = CDDA_ZERO ;
CDDA_TIME_nowtrack.sec = CDDA_ZERO ;
CDDA_TIME_nowtrack.frame = CDDA_ZERO ;
}
/*
** トータルの残り時間
*/
memcpy( (char *)&CDDA_TIME_nowdisc,(char *)&CDDA_TIME_nowtrack,
sizeof( CDDA_TRACK ) ) ;
for ( c=0; c<CDDA_MAX_TRACK; c++ ) {
if ( CDDA_prgptr+c >= CDDA_MAX_TRACK ) break ;
if ( CDDA_PLAY_no[CDDA_prgptr+c] <= CDDA_ZERO ) break ;
if ( !CDDA_data_check(CDDA_PLAY_no[CDDA_prgptr+c]) ) {
/* 音楽ならば... */
CDDA_addtime( CDDA_TIME_nowdisc.min,
CDDA_TIME_nowdisc.sec,
CDDA_TIME_nowdisc.frame,
CDDA_TIME_track[CDDA_PLAY_no[CDDA_prgptr+c]-1].min,
CDDA_TIME_track[CDDA_PLAY_no[CDDA_prgptr+c]-1].sec,
CDDA_TIME_track[CDDA_PLAY_no[CDDA_prgptr+c]-1].frame,
&CDDA_TIME_nowdisc.min,
&CDDA_TIME_nowdisc.sec,
&CDDA_TIME_nowdisc.frame ) ;
}
}
if ( CDDA_prgptr == CDDA_ZERO ) {
CDDA_subtime( CDDA_TIME_nowdisc.min,
CDDA_TIME_nowdisc.sec,
CDDA_TIME_nowdisc.frame,
CDDA_TIME_nowtrack.min,
CDDA_TIME_nowtrack.sec,
CDDA_TIME_nowtrack.frame,
&CDDA_TIME_nowdisc.min,
&CDDA_TIME_nowdisc.sec,
&CDDA_TIME_nowdisc.frame ) ;
}
/*
** トータル経過時間
*/
CDDA_subtime( CDDA_TIME_program.min,
CDDA_TIME_program.sec,
CDDA_TIME_program.frame,
CDDA_TIME_nowdisc.min,
CDDA_TIME_nowdisc.sec,
CDDA_TIME_nowdisc.frame,
&CDDA_CLOCK_nowdisc.min,
&CDDA_CLOCK_nowdisc.sec,
&CDDA_CLOCK_nowdisc.frame ) ;
/*
** プログラム経過時間(未演奏曲(演奏中含)から指示された曲番号までの合計)
*/
CDDA_CLOCK_program.min = CDDA_ZERO ;
CDDA_CLOCK_program.sec = CDDA_ZERO ;
CDDA_CLOCK_program.frame = CDDA_ZERO ;
sp = CDDA_ZERO ;
if ( CDDA_nplay > CDDA_ZERO ) sp = CDDA_nplay - 1 ;
for ( c=sp; c<CDDA_MAX_TRACK; c++ ) {
if ( CDDA_PLAY_no[c] == CDDA_ZERO ) break ;
if ( CDDA_prgptr && c == CDDA_prgptr ) break ;
CDDA_addtime( CDDA_CLOCK_program.min,
CDDA_CLOCK_program.sec,
CDDA_CLOCK_program.frame,
CDDA_TIME_track[CDDA_PLAY_no[c]-1].min,
CDDA_TIME_track[CDDA_PLAY_no[c]-1].sec,
CDDA_TIME_track[CDDA_PLAY_no[c]-1].frame,
&CDDA_CLOCK_program.min,
&CDDA_CLOCK_program.sec,
&CDDA_CLOCK_program.frame ) ;
}
}
/*************************** データかどうかチェックする **************************/
int CDDA_data_check( int musicno )
/*=============================================================================
** 指定された曲番号がデータかどうかチェックする.
**
** < INPUT > : 曲番号
** < OUTPUT > : なし
** < RETURN > : データ ならば 真値 , 音楽 ならば 偽値.
**
** 不当な曲番号を指定しないで下さい.
=============================================================================*/
{
if ( musicno <= CDDA_ZERO ) return( CDDA_FALSE ) ;
return( ( ( CDDA_INFO_buf.track[musicno-1].min & 0x80 ) == 0x80 ) ?
CDDA_TRUE : CDDA_FALSE ) ;
}
/******************************* 次の曲を設定 ******************************/
int CDDA_next_music( void )
/*=============================================================================
** 次に演奏する曲番号を設定する.
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : エラー値(演奏曲がなくなった場合にはエラーを返す)
=============================================================================*/
{
char endflg ;
int c ;
/*
** 次の曲番号設定
*/
endflg = CDDA_FALSE ;
for ( c=CDDA_nplay; c<=CDDA_MAX_TRACK; c++ ) {
if ( CDDA_PLAY_no[c] == CDDA_ZERO ) {
endflg = CDDA_TRUE ;
break ;
}
CDDA_nplay ++ ;
if ( CDDA_nplay > CDDA_MAX_TRACK ) {
CDDA_nplay = CDDA_MAX_TRACK ;
endflg = CDDA_TRUE ;
break ;
}
if ( !CDDA_data_check(CDDA_PLAY_no[CDDA_nplay-1]) ) {
/* 音楽ならば... */
CDDA_NOW_start = CDDA_PLAY_no[CDDA_nplay-1] ; /* 演奏曲番号 */
break ;
}
}
if ( endflg ) {
CDDA_NOW_end = CDDA_NOW_start ;
} else {
switch ( CDDA_PLAY_mode ) {
case CDDA_SW_SHUFFLE :
case CDDA_SW_PROGRAM :
case CDDA_SW_SINGLE :
CDDA_NOW_end = CDDA_NOW_start ;
break ;
case CDDA_SW_CONTINUE :
CDDA_NOW_end = CDDA_INFO_buf.end ;
break ;
}
}
if ( CDDA_PLAY_mode == CDDA_SW_PROGRAM ) {
CDDA_prgptr = CDDA_ZERO ;
if ( endflg ) {
if ( CDDA_nplay > CDDA_ZERO ) {
if ( CDDA_PLAY_no[CDDA_nplay-1] == CDDA_ZERO ) {
CDDA_REMAIN_program = CDDA_ZERO ;
}
} else {
CDDA_REMAIN_program = CDDA_ZERO ;
}
} else {
CDDA_REMAIN_program -- ;
}
}
/*
** return
*/
return( endflg ? CDDA_ERR_PARAMETER : CDDA_ERR_NOERROR ) ;
}
/******************************* 前の曲を設定 ******************************/
int CDDA_before_music( void )
/*=============================================================================
** 一曲前に演奏した曲番号を設定する.
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : エラー値(演奏曲が先頭よりも前になった場合にはエラーを返す)
=============================================================================*/
{
int cmp ;
char endflg ;
int c ;
/*
** 曲番号のチェック
*/
endflg = CDDA_FALSE ;
cmp = CDDA_cmptime( (signed char)CDDA_CLOCK_nowtrack.min,
(signed char)CDDA_CLOCK_nowtrack.sec,
(signed char)CDDA_CLOCK_nowtrack.frame,
0,2,0 ) ;
if ( CDDA_NOW_start == CDDA_PLAY_no[0] && cmp <= CDDA_ZERO )
endflg = CDDA_TRUE ;
if ( CDDA_PLAY_no[0] == CDDA_ZERO ) endflg = CDDA_TRUE ;
/*-----------------------------------------------------------------------------
** シャッフルモード, プログラムモード時には、前の曲に戻ることはしない.
-----------------------------------------------------------------------------*/
switch ( CDDA_PLAY_mode ) {
case CDDA_SW_SHUFFLE :
case CDDA_SW_PROGRAM :
endflg = CDDA_TRUE ;
}
/*
** 前の曲番号設定
*/
if ( cmp <= CDDA_ZERO && !endflg ) {
for ( c=CDDA_nplay; c>=CDDA_ZERO; c-- ) {
CDDA_nplay -- ;
if ( CDDA_nplay <= CDDA_ZERO ) {
CDDA_nplay = CDDA_ZERO ;
endflg = CDDA_TRUE ;
break ;
}
if ( CDDA_PLAY_no[CDDA_nplay-1] == CDDA_ZERO ) {
endflg = CDDA_TRUE ;
break ;
}
if ( !CDDA_data_check(CDDA_PLAY_no[CDDA_nplay-1]) ) {
/* 音楽ならば... */
CDDA_NOW_start = CDDA_PLAY_no[CDDA_nplay-1] ;/* 演奏曲番号 */
break ;
}
}
if ( !endflg ) {
switch ( CDDA_PLAY_mode ) {
case CDDA_SW_SHUFFLE :
case CDDA_SW_PROGRAM :
case CDDA_SW_SINGLE :
CDDA_NOW_end = CDDA_NOW_start ;
break ;
case CDDA_SW_CONTINUE :
CDDA_NOW_end = CDDA_INFO_buf.end ;
break ;
}
}
}
if ( CDDA_PLAY_mode == CDDA_SW_PROGRAM ) {
CDDA_prgptr = CDDA_ZERO ;
}
/*
** return
*/
return( endflg ? CDDA_ERR_PARAMETER : CDDA_ERR_NOERROR ) ;
}
/****************************** CD 先送り処理 ******************************/
int CDDA_fftime( void )
/*=============================================================================
** 演奏時間を先送りする.
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : エラー値(演奏時間が最後に到達した場合にはエラーを返す)
**
** この関数は、一時停止中にCALLして下さい.
=============================================================================*/
{
char nmin, nsec, nframe ; /* 演奏時間表示用 */
int cmp ;
char endflg ;
if ( CDDA_NOW_status == CDDA_STAT_PAUSE ) { /* PAUSE中 */
if ( CDDA_NOW_musicno < 1 ) return( CDDA_ERR_PARAMETER ) ;
CDDA_NOW_start = CDDA_NOW_musicno ;
CDDA_FLG_pauseplay = CDDA_TRUE ;
nsec = CDDA_CLOCK_nowtrack.sec ;
nmin = CDDA_CLOCK_nowtrack.min ;
nframe = CDDA_ZERO ;
} else { /* PAUSE中でない */
return( CDDA_ERR_NOTPAUSE ) ;
}
endflg = CDDA_FALSE ;
/*
** 時間を送る
*/
CDDA_addtime( nmin,nsec,nframe,0,CDDA_FFREV_SEC,0,&nmin,&nsec,&nframe ) ;
/*
** 時間のチェック
*/
cmp = CDDA_cmptime( (signed char)nmin,(signed char)nsec,0,
(signed char)CDDA_TIME_track[CDDA_NOW_start-1].min,
(signed char)CDDA_TIME_track[CDDA_NOW_start-1].sec,0 ) ;
if ( cmp > 0 ) { /* 次の曲時間に突入 */
/*
** 次の曲番号設定
*/
if ( CDDA_next_music() ) endflg = CDDA_TRUE ;
nmin = nsec = nframe = CDDA_ZERO ;
}
CDDA_NOW_pause = CDDA_NOW_musicno = CDDA_NOW_start ;
/*
** 演奏時間の指定
*/
if ( endflg ) { /* 終了させる */
CDDA_set_time_end( CDDA_NOW_end ) ; /* 演奏終了曲データ設定 */
memcpy( (char *)&CDDA_CLOCK_start,(char *)&CDDA_CLOCK_end,
sizeof( CDDA_TRACK ) ) ;
nmin = CDDA_TIME_track[CDDA_NOW_end-1].min ;
nsec = CDDA_TIME_track[CDDA_NOW_end-1].sec ;
nframe = CDDA_TIME_track[CDDA_NOW_end-1].frame ;
} else {
CDDA_set_time_start( CDDA_NOW_start ) ; /* 演奏開始曲データ設定 */
CDDA_addtime( CDDA_CLOCK_start.min,
CDDA_CLOCK_start.sec,
CDDA_CLOCK_start.frame,
nmin,nsec,0,
&CDDA_CLOCK_start.min,
&CDDA_CLOCK_start.sec,
&CDDA_CLOCK_start.frame ) ;
CDDA_set_time_end( CDDA_NOW_end ) ; /* 演奏終了曲データ設定 */
if ( cmp > 0 ) CDDA_seek() ;
}
/*
** 現在の曲内経過時間
*/
CDDA_CLOCK_nowtrack.min = nmin ;
CDDA_CLOCK_nowtrack.sec = nsec ;
CDDA_CLOCK_nowtrack.frame = nframe ;
memcpy( (char *)&CDDA_CLOCK_pause,(char *)&CDDA_CLOCK_nowtrack,
sizeof( CDDA_TRACK ) ) ;
/*
** 現在の残り時間
*/
CDDA_remaintime() ;
/*
** return
*/
return( endflg ? CDDA_ERR_PARAMETER : CDDA_ERR_NOERROR ) ;
}
/****************************** CD 後戻り処理 ******************************/
int CDDA_rewtime( void )
/*=============================================================================
** 演奏時間を後戻りする.
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : エラー値(演奏時間が先頭に到達した場合にはエラーを返す)
**
** この関数は、一時停止中にCALLして下さい.
=============================================================================*/
{
char nmin, nsec, nframe ; /* 演奏時間表示用 */
int cmp ;
char endflg ;
if ( CDDA_NOW_status == CDDA_STAT_PAUSE ) { /* PAUSE中 */
if ( CDDA_NOW_musicno < 1 ) return( CDDA_ERR_PARAMETER ) ;
CDDA_NOW_start = CDDA_NOW_musicno ;
CDDA_FLG_pauseplay = CDDA_TRUE ;
nsec = CDDA_CLOCK_nowtrack.sec ;
nmin = CDDA_CLOCK_nowtrack.min ;
nframe = CDDA_ZERO ;
} else { /* PAUSE中でない */
return( CDDA_ERR_NOTPAUSE ) ;
}
endflg = CDDA_FALSE ;
/*
** 時間を戻す
*/
CDDA_subtime( nmin,nsec,nframe,0,CDDA_FFREV_SEC,0,&nmin,&nsec,&nframe ) ;
/*
** 時間のチェック
*/
cmp = CDDA_cmptime( (signed char)nmin,(signed char)nsec,0,0,0,0 ) ;
if ( cmp < 0 ) { /* 前の曲時間に突入 */
/*
** 前の曲番号設定
*/
if ( CDDA_before_music() ) endflg = CDDA_TRUE ;
if ( endflg ) {
nmin = nsec = nframe = CDDA_ZERO ;
} else {
nmin = CDDA_TIME_track[CDDA_NOW_start-1].min ;
nsec = CDDA_TIME_track[CDDA_NOW_start-1].sec ;
nframe = CDDA_TIME_track[CDDA_NOW_start-1].frame ;
}
}
CDDA_NOW_pause = CDDA_NOW_musicno = CDDA_NOW_start ;
/*
** 演奏時間の指定
*/
CDDA_set_time_start( CDDA_NOW_start ) ; /* 演奏開始曲データ設定 */
CDDA_addtime( CDDA_CLOCK_start.min,
CDDA_CLOCK_start.sec,
CDDA_CLOCK_start.frame,
nmin,nsec,0,
&CDDA_CLOCK_start.min,
&CDDA_CLOCK_start.sec,
&CDDA_CLOCK_start.frame ) ;
CDDA_set_time_end( CDDA_NOW_end ) ; /* 演奏終了曲データ設定 */
if ( cmp < 0 ) CDDA_seek() ;
/*
** 現在の曲内経過時間
*/
CDDA_CLOCK_nowtrack.min = nmin ;
CDDA_CLOCK_nowtrack.sec = nsec ;
CDDA_CLOCK_nowtrack.frame = nframe ;
memcpy( (char *)&CDDA_CLOCK_pause,(char *)&CDDA_CLOCK_nowtrack,
sizeof( CDDA_TRACK ) ) ;
/*
** 現在の残り時間
*/
CDDA_remaintime() ;
/*
** return
*/
return( endflg ? CDDA_ERR_PARAMETER : CDDA_ERR_NOERROR ) ;
}
/**************************** CD 次曲頭出し処理 ****************************/
int CDDA_ffmusic( void )
/*=============================================================================
** 演奏曲を先送りする.
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : エラー値(演奏曲がなくなった場合にはエラーを返す)
**
** この関数は、一時停止中にCALLして下さい.
=============================================================================*/
{
char endflg ;
/*
** 演奏状態のチェック
*/
if ( CDDA_NOW_status == CDDA_STAT_PAUSE ) { /* PAUSE中 */
CDDA_FLG_pauseplay = CDDA_TRUE ;
} else { /* PAUSE中でない */
return( CDDA_ERR_NOTPAUSE ) ;
}
/*
** 次の曲番号設定
*/
endflg = CDDA_FALSE ;
if ( CDDA_next_music() ) endflg = CDDA_TRUE ;
CDDA_NOW_pause = CDDA_NOW_musicno = CDDA_NOW_start ;
/*
** 演奏時間の指定
*/
CDDA_set_time_start( CDDA_NOW_start ) ; /* 演奏開始曲データ設定 */
CDDA_set_time_end( CDDA_NOW_end ) ; /* 演奏終了曲データ設定 */
/*
** 現在の曲内経過時間
*/
if ( endflg ) { /* 終了させる */
memcpy( (char *)&CDDA_CLOCK_start,(char *)&CDDA_CLOCK_end,
sizeof( CDDA_TRACK ) ) ;
CDDA_CLOCK_nowtrack.min = CDDA_TIME_track[CDDA_NOW_end-1].min ;
CDDA_CLOCK_nowtrack.sec = CDDA_TIME_track[CDDA_NOW_end-1].sec ;
CDDA_CLOCK_nowtrack.frame = CDDA_TIME_track[CDDA_NOW_end-1].frame ;
} else {
CDDA_CLOCK_nowtrack.min = CDDA_ZERO ;
CDDA_CLOCK_nowtrack.sec = CDDA_ZERO ;
CDDA_CLOCK_nowtrack.frame = CDDA_ZERO ;
}
CDDA_seek() ;
memcpy( (char *)&CDDA_CLOCK_pause,(char *)&CDDA_CLOCK_nowtrack,
sizeof( CDDA_TRACK ) ) ;
/*
** 現在の残り時間
*/
CDDA_remaintime() ;
/*
** return
*/
return( endflg ? CDDA_ERR_PARAMETER : CDDA_ERR_NOERROR ) ;
}
/**************************** CD 前曲頭出し処理 ****************************/
int CDDA_rewmusic( void )
/*=============================================================================
** 演奏曲を後戻りする(演奏中の曲は頭出しとする).
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : エラー値(演奏曲が先頭よりも前になった場合にはエラーを返す)
**
** この関数は、一時停止中にCALLして下さい.
=============================================================================*/
{
char endflg ;
/*
** 演奏状態のチェック
*/
if ( CDDA_NOW_status == CDDA_STAT_PAUSE ) { /* PAUSE中 */
CDDA_FLG_pauseplay = CDDA_TRUE ;
} else { /* PAUSE中でない */
return( CDDA_ERR_NOTPAUSE ) ;
}
/*
** 前の曲番号設定
*/
endflg = CDDA_FALSE ;
if ( CDDA_before_music() ) endflg = CDDA_TRUE ;
CDDA_NOW_pause = CDDA_NOW_musicno = CDDA_NOW_start ;
/*
** 演奏時間の指定
*/
CDDA_set_time_start( CDDA_NOW_start ) ; /* 演奏開始曲データ設定 */
CDDA_set_time_end( CDDA_NOW_end ) ; /* 演奏終了曲データ設定 */
CDDA_seek() ;
/*
** 現在の曲内経過時間
*/
CDDA_CLOCK_nowtrack.min = CDDA_ZERO ;
CDDA_CLOCK_nowtrack.sec = CDDA_ZERO ;
CDDA_CLOCK_nowtrack.frame = CDDA_ZERO ;
memcpy( (char *)&CDDA_CLOCK_pause,(char *)&CDDA_CLOCK_nowtrack,
sizeof( CDDA_TRACK ) ) ;
/*
** 現在の残り時間
*/
CDDA_remaintime() ;
/*
** return
*/
return( endflg ? CDDA_ERR_PARAMETER : CDDA_ERR_NOERROR ) ;
}